package com.crm.jpaandthymeleaf.shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @author 周敬
 * @version 1.0
 * @packageName com.crm.jpaandthymeleaf.shiro
 * @fileName ShiroTester
 * @createTime 2021/12/22-15:43-星期三
 * @lastModify 2021/12/22-15:43-星期三
 */
@SpringBootTest
public class ShiroTester {
    @Test
    public void testShiro(){
        //1.创建Realm（安全数据）
        //通过shiro.ini配置文件创建Realm
        IniRealm realm = new IniRealm("classpath:shiro.ini");
        //2.配置SecurityManager
        DefaultSecurityManager securityManager = new DefaultSecurityManager();

        //注入创建的Realm（安全源）
        securityManager.setRealm(realm);
        SecurityUtils.setSecurityManager(securityManager);
        //3.操作Subject，进行认证
        Subject subject = SecurityUtils.getSubject();

        //封装一个令牌
        UsernamePasswordToken token = new UsernamePasswordToken("admin","123456");
        //登录，即认证
        try {
            subject.login(token);
        } catch (AuthenticationException e) {
            System.out.println("认证异常：");
            e.printStackTrace();
        }
        System.out.println("是否通过认证："+subject.isAuthenticated());
//        System.out.println("身份信息："+subject.getPrincipal());
        System.out.println("是否为管理员角色："+subject.hasRole("管理员"));
        //是否为某角色
        System.out.println("是否能操作用户查看功能："+subject.isPermitted("user:view"));
        //也可以用check方法判断是否拥有某权限，但是失败的情况下会抛出UnauthorizedException异常
        subject.checkPermission("user:view");
    }
}
